f = open("E:\\Python_Basic\\_09_IO编程\\_01_文件读写.txt", "r")
print(f.read())  # 调用read()方法可以一次读取文件的全部内容，Python把内容读到内存，用一个str对象表示。
with open("E:\\Python_Basic\\_09_IO编程\\_01_文件读写.txt", "r") as f:
    print(f.readlines())  # with下的内容操作结束后便关掉流
try:
    f = open("E:\\Python_Basic\\_09_IO编程\\_01_文件读写.txt", "r")
    for line in f.readlines():
        print(line.strip())  # 可以去掉末尾的\n
finally:
    if f:
        f.close()

# file-like Object
# 像open()函数返回的这种有个read()方法的对象，在Python中统称为file-like Object。
# 除了file外，还可以是内存的字节流，网络流，自定义流等等。file-like Object不要求从特定类继承，只要写个read()方法就行。
# StringIO就是在内存中创建的file-like Object，常用作临时缓冲。

# 二进制文件
# 前面讲的默认都是读取文本文件，并且是UTF-8编码的文本文件。要读取二进制文件，比如图片、视频等等，用'rb'模式打开文件即可：
f2 = open("E:\\Python_Basic\\_09_IO编程\\_01_文件读写.txt", "rb")
print("测试二进制读取文件：", end="")
print(f2.read())

# 字符编码
# 遇到有些编码不规范的文件，你可能会遇到UnicodeDecodeError，因为在文本文件中可能夹杂了一些非法编码的字符。
# 遇到这种情况，open()函数还接收一个errors参数，表示如果遇到编码错误后如何处理。最简单的方式是直接忽略：
f3 = open("E:\\Python_Basic\\_09_IO编程\\_01_文件读写.txt", "r", encoding="GBK", errors="ignore")
print("测试字符编码输出：", end="")
print(f3.readline())

# ############写文件
with open("E:\\Python_Basic\\_09_IO编程\\_01_文件读写.txt", "a") as f4:  # 追加在最后一行后
    f4.write('Hello, world!')
# w模式是覆盖 a模式是追加
